/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package business;

import data.*;
import java.sql.SQLException;
import java.util.GregorianCalendar;


/**
 *
 * @author MÃ¡rio
 */
public class Clientes {
    public static final long year = 12000;

    PacotesData dataP;
    ServicosData dataS;
    UtilizadoresData dataU;
    HistoricoData dataH;
    CampanhaData dataC;

    public Clientes() {
        dataP = new PacotesData();
        dataU = new UtilizadoresData();
        dataS = new ServicosData();
        dataC = new CampanhaData();
    }

    public int addCliente(GregorianCalendar dataAdesao, String morada, String nome, String password) throws Exception{
        return dataU.addCliente(dataAdesao, morada, nome, password);
    }

    public void setDebitoDirecto(int codCliente,boolean dd) throws Exception{
        dataU.setDebitoDirecto(codCliente, dd);
        Historico h;
        if(dd==true) {
            h = new Historico("aderiu ao debito directo", new GregorianCalendar(), codCliente);
        }
        else {
            h = new Historico("cancelou debito directo", new GregorianCalendar(), codCliente);
        }
        dataH.adicionarHistorico(h);
    }

    public void setFactElectronica(int codCliente,boolean fe) throws Exception{
        dataU.setFactElectronica(codCliente, fe);
        Historico h;
        if(fe==true) {
            h = new Historico("aderiu a factura electronica", new GregorianCalendar(), codCliente);
        }
        else {
            h = new Historico("cancelou a factura electronica", new GregorianCalendar(), codCliente);
        }
        dataH.adicionarHistorico(h);
    }

    public void comprarPacote(int codCliente,int codPacote) throws SQLException{
        dataP.adicionarSubscricaoPacote(codCliente,codPacote);
        Historico h = new Historico("comprou pacote" + codPacote, new GregorianCalendar(), codCliente);
        dataH.adicionarHistorico(h);
    }

    public void comprarServico(int codCliente,int codServico) throws SQLException{
        dataS.comprarServico(codCliente,codServico);
        Historico h = new Historico("comprou servico" + codServico, new GregorianCalendar(), codCliente);
        dataH.adicionarHistorico(h);
    }

    public void cancelarPacote(int codCliente,int codPacote) throws SQLException{
        dataP.cancelarSubscricaoPacote(codCliente,codPacote);
        Historico h = new Historico("cancelou pacote" + codPacote, new GregorianCalendar(), codCliente);
        dataH.adicionarHistorico(h);
    }

    public void cancelarServico(int codCliente,int codServico) throws SQLException{
        dataS.cancelarServico(codCliente,codServico);
        Historico h = new Historico("cancelou servico" + codServico, new GregorianCalendar(), codCliente);
        dataH.adicionarHistorico(h);
    }


    public boolean podeRemoverCliente(int codCliente) throws Exception {
        GregorianCalendar dataActual = new GregorianCalendar();
        GregorianCalendar dataAdesao = (GregorianCalendar) dataU.dataAdesaoCliente(codCliente).clone() ;
        long diferenca = (dataAdesao.getTimeInMillis()- dataActual.getTimeInMillis());
        if (diferenca >= year){return true;}
        else {return false;}
        }

    public void removerCliente (int codCliente) throws Exception{
        if (podeRemoverCliente(codCliente)==true ){
            dataU.removerCliente(codCliente);
        }
        else {throw new Exception("Cliente nao pode ser removido");}
    }

    public double getMensalidadeCliente(int codCliente) throws Exception{
        double total = 0;

        for(Servico s : dataS.consultarServCliente(codCliente)){
            total += s.getPreco();
        }

        for(Pacote p : dataP.consultarPacCliente(codCliente)){
            total += p.getPreco();
        }

        for(Campanha c : dataC.consultarCampCliente(codCliente)){
            total += c.getPreco();
        }

        return total;
    }

    public void adicionarSubscricaoCampanha(int codCliente,int codCampanha) throws Exception{
       for (Pacote p : dataP.consultarPacCliente(codCliente) ){
            for (int i : dataC.daCodPacoteCampanha(codCampanha) ){
                if (p.getCodigo()==i){
                    dataP.cancelarSubscricaoPacote(codCliente,i);
                }
            }
        }
        dataC.adicionarSubscricaoCampanha(codCliente,codCampanha);
    }

    public void cancelarSubscricaoCampanha(int codCliente,int codCampanha){
        dataC.cancelarSubscricaoCampanha(codCliente,codCampanha);
    }
}
